package Gradle基础;

自定义Property

设置和读取Project的Property是使用Gradle的一个很重要的方面。比如，很多Plugin都会向Project中加入额外的Property，、
在使用这些Plugin时，我们需要对这些Property进行赋值。

Gradle在默认情况下已经为Project定义了很多Property，其中比较常用的有：

◾project：Project本身
◾name：Project的名字
◾path：Project的绝对路径
◾description：Project的描述信息
◾buildDir：Project构建结果存放目录
◾version：Project的版本号
以下，我们首先设置Project的version和description属性，再定义showProjectProperties以打印这些属性：

version = 'this is the project version'
description = 'this is the project description'

task showProjectProperties << {
 println version
 println project.description
}

请注意，在打印description时，我们使用了project.description，而不是直接使用description。原因在于，Project和Task都
拥有description属性，而定义Task的闭包将delegate设置成了当前的Task，故如果直接使用description，此时打印的
是showProjectProperties的description，而不是Project的，所以我们需要显式地指明project。

Gradle还为我们提供了多种方法来自定义Project的Property。

（一）在build.gradle文件中定义Property
在build.gradle文件中向Project添加额外的Property时，我们并不能直接定义，而是应该通过ext来定义。如果要添加一个
名为property1的Property，我们应该：

ext.property1 = "this is property1"

另外，我们也可以通过闭包的方式：

ext {
 property2 = "this is property2"
}


在定义了Property后，使用这些Property时我们则不需要ext，而是可以直接访问：

task showProperties << {
 println property1
 println property2
}

事实上，任何实现了ExtensionAware接口的Gradle对象都可以通过这种方式来添加额外的Property，比如Task也实现了该接口。

（二）通过命令行参数定义Property
Gradle还提供了-P命令行参数来设置Property，比如：

task showCommandLieProperties << {
 println property3
}

在执行“gradle showCommandLieProperties”时，终端输出如下：

* What went wrong:
Execution failed for task ':showCommandLieProperties'.
> Could not find property 'property3' on task ':showCommandLieProperties'.

表示property3并没有被定义，在调用gradle命令时，通过-P参数传入该Property：

gradle -Pproperty3="this is property3" showCommandLieProperties

此时终端显示：

:showCommandLieProperties
this is property3

BUILD SUCCESSFUL

（三）通过JVM系统参数定义Property　　

我们知道，在java中，我们可以通过-D参数定义JVM的系统参数，然后在代码中可以可以通过System.getProperty()进行获取。在Gradle
中，我们也可以通过-D的方式向Project传入Property，只是此时我们需要遵循一些约定：每一个通过-D方式声明的Property都需要
以“org.gradle.project”为前缀，对于上面的showCommandLieProperties，我们也可以通过以下方式设置property3：

gradle -Dorg.gradle.project.property3="this is another property3" showCommandLieProperties


（四）通过环境变量设置Property
我们还可以通过设置环境变量的方式设置Project的Property。这种方式和（3）一样，需要我们遵循一些约定：在定义环境变量时，每一个Property都需要以“ORG_GRADLE_PROJECT_”为前缀：

export ORG_GRADLE_PROJECT_property3="this is yet another property3"


在调用showCommandLieProperties时，我们便不需要传入命令行参数了：

gradle showCommandLieProperties

在笔者所工作的项目中，我们的持续集成服务器便是通过这种方式为Gradle设置Property的。
